package redlib.backend.service.impl;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import redlib.backend.dao.ContactsMapper;
import redlib.backend.dto.ContactsDTO;
import redlib.backend.dto.query.ContactsProvinceDTO;
import redlib.backend.dto.query.ContactsQueryDTO;
import redlib.backend.model.Contacts;
import redlib.backend.model.Page;
import redlib.backend.model.Token;
import redlib.backend.service.AdminService;
import redlib.backend.service.ContactsService;
import redlib.backend.service.utils.ContactsUtils;
import redlib.backend.utils.FormatUtils;
import redlib.backend.utils.PageUtils;
import redlib.backend.utils.ThreadContextHolder;
import redlib.backend.vo.ContactsProvinceVO;
import redlib.backend.vo.ContactsVO;

import java.util.*;
import java.util.stream.Collectors;

@Service
public class ContactsServiceImpl implements ContactsService {
    @Autowired
    private ContactsMapper contactsMapper;

    @Autowired
    private AdminService adminService;

    public ContactsServiceImpl(ContactsMapper contactsMapper) {
        this.contactsMapper = contactsMapper;
    }

    @Override
    public Integer addContacts(ContactsDTO contactsDTO) {
        Token token = ThreadContextHolder.getToken();
        //校验数据输入的正确性
        ContactsUtils.validateContacts(contactsDTO);
        Assert.isNull(contactsMapper.getByName(contactsDTO.getContactsName()),"联系人已存在");
        //创建一个实体对象，之后用于将之加载到数据库
        Contacts contacts = new Contacts();
        BeanUtils.copyProperties(contactsDTO, contacts);
        contacts.setCreatedAt(new Date());
        contacts.setUpdatedAt(new Date());
        contacts.setCreatedBy(token.getUserId());
        contacts.setUpdatedBy(token.getUserId());
        contactsMapper.insert(contacts);
        return contacts.getId();

    }

    @Override
    public Integer updateContacts(ContactsDTO contactsDTO) {
        // 校验输入数据正确性
        Token token = ThreadContextHolder.getToken();
        ContactsUtils.validateContacts(contactsDTO);
        Assert.notNull(contactsDTO.getId(), "联系人id不能为空");
       Contacts contacts = contactsMapper.selectByPrimaryKey(contactsDTO.getId());
        Assert.notNull(contacts, "没有找到联系人，Id为：" + contactsDTO.getId());

        BeanUtils.copyProperties(contactsDTO, contacts);
        contacts.setUpdatedBy(token.getUserId());
        contacts.setUpdatedAt(new Date());
        contactsMapper.updateByPrimaryKey(contacts);
        return contacts.getId();
    }

    @Override
    public Page<ContactsVO> listByPage(ContactsQueryDTO contactsqueryDTO) {
        if (contactsqueryDTO == null) {
            contactsqueryDTO = new ContactsQueryDTO();
        }

        contactsqueryDTO.setContactsName(FormatUtils.makeFuzzySearchTerm(contactsqueryDTO.getContactsName()));
        contactsqueryDTO.setGender(FormatUtils.makeFuzzySearchTerm(contactsqueryDTO.getContactsName()));
        contactsqueryDTO.setDepartmentName(FormatUtils.makeFuzzySearchTerm(contactsqueryDTO.getDepartmentName()));
        contactsqueryDTO.setContactPhone(FormatUtils.makeFuzzySearchTerm(contactsqueryDTO.getContactPhone()));
        contactsqueryDTO.setProvince(FormatUtils.makeFuzzySearchTerm(contactsqueryDTO.getProvince()));
        Integer size = contactsMapper.count(contactsqueryDTO);
        PageUtils pageUtils = new PageUtils(contactsqueryDTO.getCurrent(), contactsqueryDTO.getPageSize(), size);

        if (size == 0) {
            // 没有命中，则返回空数据。
            return pageUtils.getNullPage();
        }

        // 利用myBatis到数据库中查询数据，以分页的方式
        List<Contacts> list = contactsMapper.list(contactsqueryDTO, pageUtils.getOffset(), pageUtils.getLimit());

        // 提取list列表中的创建人字段，到一个Set集合中去
        Set<Integer> adminIds = list.stream().map(Contacts::getCreatedBy).collect(Collectors.toSet());

        // 提取list列表中的更新人字段，追加到集合中去
        adminIds.addAll(list.stream().map(Contacts::getCreatedBy).collect(Collectors.toSet()));

        // 获取id到人名的映射
        Map<Integer, String> nameMap = adminService.getNameMap(adminIds);

        List<ContactsVO> voList = new ArrayList<>();
        for (Contacts contacts : list) {
            // Department对象转VO对象
            ContactsVO vo = ContactsUtils.convertToVO(contacts, nameMap);
            voList.add(vo);
        }

        return new Page<>(pageUtils.getCurrent(), pageUtils.getPageSize(), pageUtils.getTotal(), voList);
    }

    @Override
    public void deleteByCodes(List<Integer> ids) {
        Assert.notEmpty(ids, "id列表不能为空");
        contactsMapper.deletedByCodes(ids);
    }




    @Override
    public void insert(ContactsDTO contactsDTO) {
        Assert.hasText(contactsDTO.getContactsName(), "名称不能为空");
        Contacts contacts = new Contacts();
        contacts.setContactsName(contactsDTO.getContactsName());
        contacts.setGender(contactsDTO.getGender());
        contacts.setDepartmentName(contactsDTO.getDepartmentName());
        contacts.setContactPhone(contactsDTO.getContactPhone());
        contacts.setProvince(contactsDTO.getProvince());
        contacts.setEmail(contactsDTO.getEmail());
        contacts.setCreatedAt(new Date());
        contacts.setUpdatedAt(new Date());
        contactsMapper.insert(contacts);
    }

    @Override
    public List<ContactsProvinceVO> staContactsProvince() {
        List<ContactsProvinceVO> voList = new ArrayList<>();
        List<ContactsProvinceDTO> dtoList = contactsMapper.StaProvince();
        for (ContactsProvinceDTO contactProvinceDTO : dtoList) {
            ContactsProvinceVO contactProvinceVO = new ContactsProvinceVO();
            BeanUtils.copyProperties(contactProvinceDTO, contactProvinceVO);
            voList.add(contactProvinceVO);
        }
        return voList;
    }
}
